﻿/*------------------------------------------------------------------------

RENDERUNITREG.HPP v1.0.1

Copyright 楊志賢 CxxlMan, 2012 - 2013
All Rights Reserved

這項功能在提供一個方便的方法為 IRenderDatagram 或 IDatagramDisposal 元件做註冊
的工作，其方法是在 IRenderDatagram 或 IDatagramDisposal 元件檔(dll 檔)同一個資
料夾中放一個元件註冊檔，這樣不管 C3D 位於哪裡，都能正確註冊。

元件註冊檔和 CxxlMan 程式庫中 cxxlCM_ElementImport() 要求的格式類似，但不須包
含元件檔(dll 檔)路徑，而由本功能在處理過程中自動加上。

------------------------------------------------------------------------*/

#if !defined(__RENDERUNITREG_HPP_Cxxl3D)
#define __RENDERUNITREG_HPP_Cxxl3D


#include <CENTRALIZEDMGR.HPP>
#include <CXXL3DCOMMON.HPP>

// 只負責註冊 RenderUnit 元件的工作
#define IRenderUnitReg_ClassID L"77A44DCB-19D9-46ee-AED8-047BC833F9AD"

namespace Cxxl3D
{


  class IRenderUnitReg:public CxxlMan::cxxlObject
{
public:
  // Constructor
  IRenderUnitReg()
    :cxxlObject(CxxlMan::Spirit_Easy)
  {
  }

  // Destructor
  virtual ~IRenderUnitReg()
  {
  }

  virtual void cxxlFASTCALL Reg(const CxxlMan::UNICODE_String &ExtFileName, const CxxlMan::UNICODE_String &Group) = 0;

};

// 為 IRenderDatagram 或 IDatagramDisposal 元件做註冊的工作
// Group 指示要做註冊的群族，也是 IRenderDatagram 或 IDatagramDisposal 所在的子資料夾
inline void RenderUnit_Reg(const CxxlMan::UNICODE_String &ExtFileName, const CxxlMan::UNICODE_String &Group)
{
  CxxlMan::Smart_Ptr<IRenderUnitReg> IRenderUnitRegl_Ptr = CxxlMan::Smart_Cast<IRenderUnitReg>( 
    CxxlMan::cxxlCM_GetElement(IRenderUnitReg_ClassID, CxxlMan::UNICODE_String(CXXL3DDEFAULTGROUP)) );

  if(IRenderUnitRegl_Ptr == NULL)
  {
    CxxlMan::cxxlCM_ElementReg(IRenderUnitReg_ClassID, CxxlMan::UNICODE_String(CXXL3DDEFAULTGROUP), L"RenderUnit_Reg.dll");
    IRenderUnitRegl_Ptr = CxxlMan::Smart_Cast<IRenderUnitReg>( 
      CxxlMan::cxxlCM_GetElement(IRenderUnitReg_ClassID, CxxlMan::UNICODE_String(CXXL3DDEFAULTGROUP)) );
  }

  IRenderUnitRegl_Ptr->Reg(ExtFileName,Group);
}


} /* namespace Cxxl3D */
#endif
